/*!
 * Ext JS Library 3.2.0
 * Copyright(c) 2006-2010 Ext JS, Inc.
 * licensing@extjs.com
 * http://www.extjs.com/license
 */
/**
 * @class Ext.ux.TabCloseMenu
 * @extends Object Plugin (ptype = 'tabclosemenu') for adding a close context
 *          menu to tabs. Note that the menu respects the closable configuration
 *          on the tab. As such, commands like remove others and remove all will
 *          not remove items that are not closable.
 * 
 * @constructor
 * @param {Object}
 *            config The configuration options
 * @ptype tabclosemenu
 */
Ext.ux.TabCloseMenu = Ext
		.extend(
				Object,
				{
					/**
					 * @cfg {String} closeTabText The text for closing the
					 *      current tab. Defaults to <tt>'Close Tab'</tt>.
					 */
					closeTabText : '关闭',

					/**
					 * @cfg {String} closeOtherTabsText The text for closing all
					 *      tabs except the current one. Defaults to
					 *      <tt>'Close Other Tabs'</tt>.
					 */
					closeOtherTabsText : '关闭其他',

					/**
					 * @cfg {Boolean} showCloseAll Indicates whether to show the
					 *      'Close All' option. Defaults to <tt>true</tt>.
					 */
					showCloseAll : true,

					/**
					 * @cfg {String} closeAllTabsText
					 *      <p>
					 *      The text for closing all tabs. Defaults to
					 *      <tt>'Close All Tabs'</tt>.
					 */
					closeAllTabsText : '关闭所有',

					constructor : function(config) {
						Ext.apply(this, config || {});
					},

					// public
					init : function(tabs) {
						this.tabs = tabs;
						tabs.on( {
							scope : this,
							contextmenu : this.onContextMenu,
							destroy : this.destroy
						});
					},

					destroy : function() {
						Ext.destroy(this.menu);
						delete this.menu;
						delete this.tabs;
						delete this.active;
					},

					// private
					onContextMenu : function(tabs, item, e) {
						this.active = item;
						var m = this.createMenu(), disableAll = true, disableOthers = true, closeAll = m
								.getComponent('closeall');

						m.getComponent('close').setDisabled(!item.closable);
						tabs.items.each(function() {
							if (this.closable) {
								disableAll = false;
								if (this != item) {
									disableOthers = false;
									return false;
								}
							}
						});
						m.getComponent('closeothers')
								.setDisabled(disableOthers);
						if (closeAll) {
							closeAll.setDisabled(disableAll);
						}

						e.stopEvent();
						m.showAt(e.getPoint());
					},

					createMenu : function() {
						if (!this.menu) {
							var items = [ {
								itemId : 'close',
								iconCls : 'btn-close',
								text : this.closeTabText,
								scope : this,
								handler : this.onClose
							} ];
							if (this.showCloseAll) {
								items.push('-');
							}
							items.push( {
								itemId : 'closeothers',
								iconCls : 'btn-close',
								text : this.closeOtherTabsText,
								scope : this,
								handler : this.onCloseOthers
							});
							if (this.showCloseAll) {
								items.push( {
									itemId : 'closeall',
									iconCls : 'btn-close',
									text : this.closeAllTabsText,
									scope : this,
									handler : this.onCloseAll
								});
							}
							this.menu = new Ext.menu.Menu( {
								items : items
							});
						}
						return this.menu;
					},

					onClose : function() {
						this.tabs.remove(this.active);
					},

					onCloseOthers : function() {
						this.doClose(true);
					},

					onCloseAll : function() {
						this.doClose(false);
					},

					doClose : function(excludeActive) {
						var items = [];
						this.tabs.items.each(function(item) {
							if (item.closable) {
								if (!excludeActive || item != this.active) {
									items.push(item);
								}
							}
						}, this);
						Ext.each(items, function(item) {
							this.tabs.remove(item);
						}, this);
					}
				});

Ext.preg('tabclosemenu', Ext.ux.TabCloseMenu);